<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>66_原型.html</title>
    <script type="text/javascript">

        /**
         * 原型prototype
         *  
         * 每一个函数，解析器都会为函数添加一个属性prototype
         *  这个属性对应的是一个对象，就是所谓的原型对象，各实例共用此对象
         *      可以将一些共用的函数属性设置到原型中，这样节省性能。
         * 
         * 当我们访问对象的一个属性或方法时，它会先在对象身身中查找，如果有就直接使用，如果没有，就尝试在原型对
         * 象中查找，如果能找到就使用。
        */

        function Person(){

        }

        //向原型中添加方法
        Person.prototype.sayHello = function(){
            console.log(this.name);
        }

        function MyClass(){

            this.age  = 18;

        }

        //向原型对象中添加属性
        MyClass.prototype.name = "我是原型中的名字";

        console.log(Person.prototype == MyClass.prototype);

        var ob1 = new Person();
        var ob2 = new Person();
        console.log(ob1);
        console.log(ob1.__proto__ === ob2.__proto__);

        /**
         * 检查一个对象中是否含有属性时，如果原型对象中有，也会返回true
        */
        var mc = new MyClass();
        console.log("name" in mc);

        //可以使用对象的 hasOwnProperty 方法检查对象自身是否含有对象属性，而不检查原型中有没有
        console.log(mc.hasOwnProperty("name"));
        console.log(mc.hasOwnProperty("age"));

        /**
         * 原型对象也是对象，所以也有原型
         * 当我们使用对象的属性或方法时：
         *  自身如果没有，就找原型，原型中没有，就找原型的原型（Object的原型），如果还没有，就直接算没有了返回undefined。
        */
        console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));

    </script>
</head>
<body>
    
</body>
</html>